package thread.thread_pool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test3 {
    public static void main(String[] args) {
        ThreadPoolExecutor tpe = new ThreadPoolExecutor(
                5,// 1.核心线程数量 >= 0
                20,// 2.最大线程数量 = 核心线程数量 + 临时线程数量 > 0
                60,// 3.临时线程存活时间
                TimeUnit.SECONDS, // 4.时间单位TimeUnit
                // 5.阻塞队列（提交任务超出最大线程数量，在次队列进行排队）
                new ArrayBlockingQueue<>(10), // 允许进行排队任务10
                    // 1.有界队列：存在存储边界，通常收到数据结构的影响
                    // ArrayBlockingQueue：底层是数组，先进先出
                    // 2.无界队列：存储没有边界（受到内存影响）
                    // LinkedBlockingQueue,底层是链表，先进先出
                // 6.线程工厂（创建线程的操作）
                Executors.defaultThreadFactory(),//默认线程工厂
                // 7.任务拒接策略（提交任务数量 > 最大线程 + 阻塞队列长度，触发拒绝策略）
                    // 拒绝策略一共有四种
                    // 默认拒绝策略：超出任务数量，促发拒绝策略，丢弃任务抛出异常
                new ThreadPoolExecutor.AbortPolicy() // RejectedExecutionException
        );
        for (int i = 0; i < 50; i++) {
            int finalI = i;
            tpe.submit(()->{
                System.out.println(Thread.currentThread().getName() + "-" + finalI);
            });
        }
        tpe.shutdown();
    }
}
